package com.nts.visionworks.business.streamevent.controller;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import com.nts.visionworks.business.streamevent.domain.StreamEvent;
import com.nts.visionworks.business.streamevent.domain.StreamSynapse;
import com.nts.visionworks.business.streamevent.domain.StreamSynapseCoefficient;
import com.nts.visionworks.business.streamevent.domain.StreamSynapseTransmitter;
import com.nts.visionworks.business.streamevent.service.StreamEventService;
import com.nts.visionworks.core.hibernate.query.PaginationDirector;

/**
 * 스트림 이벤트 관련 요청을 처리하기 위한 인터페이스를 제공한다.
 * @author Devcken
 */
@Controller
@RequestMapping("/streamEvent")
public class StreamEventController
{
	private final static Logger logger = LoggerFactory.getLogger(StreamEventController.class);
	
	/**
	 * 스트림 이벤트 관련 DAO를 주입받는다.
	 */
	@Resource(name="streamEventService")
	private StreamEventService _streamEventService;
	
	/**
	 * 데이터 페이지네이션을 위한 지시자를 주입받는다.
	 */
	@Resource(name="paginationDirector")
	private PaginationDirector _paginationDirector;
	
	/**
	 * 스트림 이벤트 목록 조회 요청에 대한 처리 결과를 뷰로 전달한다.
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @param streamEventName 검색하려는 스트림 이벤트의 이름이 전달된다.
	 * @return 조회된 끝점 목록을 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RequestMapping(value="/list", method=RequestMethod.GET)
	public ModelAndView listStreamEvents(HttpServletRequest request,
			@RequestParam(value="streamEventName", required=false)String streamEventName)
	{
		Map<String, Object> map = new HashMap<String, Object>();
		
		try
		{
			List<StreamEvent> streamEvents = this._streamEventService.listStreamEvents(streamEventName);
			
			map.put("streamEvents", streamEvents);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", map);
	}
	
	/**
	 * 스트림 이벤트 저장 요청에 대한 처리 결과를 뷰로 전달한다.
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @param streamEvent 저장하려는 스트림 이벤트 정보가 전달된다.
	 * @return 저장된 스트림 이벤트 정보를 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RequestMapping(value="/save", method=RequestMethod.GET)
	public ModelAndView saveStreamEvent(HttpServletRequest request,
			StreamEvent streamEvent)
	{
		Map<String, Object> map = new HashMap<String, Object>();
		
		try
		{
			this._streamEventService.saveStreamEvent(streamEvent);
			
			map.put("streamEvent", streamEvent);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", map);
	}

	/**
	 * 스트림 시냅스 목록 조회 요청에 대한 처리 결과를 뷰로 전달한다.
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @param eventId 조회하려는 스트림 시냅스 목록에 대한 스트림 이벤트의 아이디가 전달된다.
	 * @param sourceEndPointId 조회하려는 스트림 시냅스에 대한 출발 끝점 아이디가 전달된다.
	 * @param destinationEndPointId 조회하려는 스트림 시냅스에 대한 도착 끝점 아이디가 전달된다.
	 * @return 조회된 스트림 시냅스 목록을 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RequestMapping(value="/synapse/list", method=RequestMethod.GET)
	public ModelAndView listStreamSynapses(HttpServletRequest request,
			@RequestParam(value="eventId", required=true)Long eventId,
			@RequestParam(value="sourceEndPointId", required=false, defaultValue="0")Long sourceEndPointId,
			@RequestParam(value="destinationEndPointId", required=false, defaultValue="0")Long destinationEndPointId)
	{
		Map<String, Object> map = new HashMap<String, Object>();
		
		try
		{
			List<StreamSynapse> streamSynapses = this._streamEventService.listStreamSynapses(eventId, sourceEndPointId, destinationEndPointId);
			
			map.put("streamSynapses", streamSynapses);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", map);
	}
	
	/**
	 * 스트림 시냅스 저장 요청에 대한 처리 결과를 뷰로 전달한다.
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @param eventId 저장하려는 스트림 시냅스에 대한 스트림 이벤트 아이디가 전달된다. 
	 * @param streamSynapse 저장하려는 스트림 시냅스 정보가 전달된다.
	 * @return 저장된 스트림 시냅스 정보를 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RequestMapping(value="/synapse/save", method=RequestMethod.GET)
	public ModelAndView saveStreamSynapse(HttpServletRequest request,
			@RequestParam(value="eventId", required=true)Long eventId,
			StreamSynapse streamSynapse)
	{
		Map<String, Object> map = new HashMap<String, Object>();
		
		try
		{
			this._streamEventService.saveStreamSynapse(eventId, streamSynapse);
			
			map.put("streamSynapse", streamSynapse);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", map);
	}
	
	/**
	 * 스트림 시냅스 전달 매체 조회 요청에 대한 처리 결과를 뷰로 전달한다.
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @param synapseId 조회하려는 전달 매체에 대한 스트림 시냅스 아이디가 전달된다.
	 * @return 조회된 스트림 시냅스 전달 매체 목록을 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RequestMapping(value="/synapse/transmitter/list", method=RequestMethod.GET)
	public ModelAndView listStreamSynapseTransmitters(HttpServletRequest request,
			@RequestParam(value="synapseId", required=true)Long synapseId)
	{
		Map<String, Object> map = new HashMap<String, Object>();
		
		try
		{
			List<StreamSynapseTransmitter> streamSynapseTransmitters = this._streamEventService.listStreamSynapseTransmitters(synapseId);
			
			map.put("streamSynapseTransmitters", streamSynapseTransmitters);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", map);
	}
	
	/**
	 * 스트림 시냅스 전달 매체 정보 저장 요청에 대한 처리 결과를 뷰로 전달한다.
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @param synapseId 저장하려는 전달 매체에 대한 스트림 시냅스 아이디가 전달된다.
	 * @param streamSynapseTransmitter 저장하려는 스트림 시냅스 전달 매체 정보가 전달된다.
	 * @return 저장된 스트림 시냅스 전달 매체 정보를 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RequestMapping(value="/synapse/transmitter/save", method=RequestMethod.GET)
	public ModelAndView saveStraemSynapseTransmitter(HttpServletRequest request,
			@RequestParam(value="synapseId", required=true)Long synapseId,
			StreamSynapseTransmitter streamSynapseTransmitter)
	{
		Map<String, Object> map = new HashMap<String, Object>();
		
		try
		{
			this._streamEventService.saveStreamSynapseTransmitter(synapseId, streamSynapseTransmitter);
			
			map.put("streamSynapseTransmitter", streamSynapseTransmitter);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", map);
	}
	
	/**
	 * 스트림 시냅스 계수 목록 요청에 대한 처리 결과를 뷰로 전달한다.
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @param synapseId 조회하려는 계수에 대한 스트림 시냅스 아이디가 전달된다.
	 * @return 조회된 스트림 시냅스 계수 목록을 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RequestMapping(value="/synapse/coefficient/list", method=RequestMethod.GET)
	public ModelAndView listStreamSynapseCoefficients(HttpServletRequest request,
			@RequestParam(value="synapseId", required=true)Long synapseId)
	{
		Map<String, Object> map = new HashMap<String, Object>();
		
		try
		{
			List<StreamSynapseCoefficient> streamSynapseCofficients = this._streamEventService.listStreamSynapseCoefficients(synapseId);
			
			map.put("streamSynapseCofficients", streamSynapseCofficients);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", map);
	}
	
	/**
	 * 스트림 시냅스 계수 정보 저장 요청에 대한 처리 결과를 뷰로 전달한다.
	 * @param request HTTP 서블릿에 대한 요청 정보가 전달된다.
	 * @param synapseId 저장하려는 스트림 시냅스 계수에 대한 스트림 시냅스 아이디가 전달된다.
	 * @param streamSynapseCoefficient 저장하려는 스트림 시냅스 계수가 전달된다.
	 * @return 저장된 스트림 시냅스 계수 정보를 포함하는 {@link org.springframework.web.servlet.ModelAndView.ModelAndView} 개체를 반환한다.
	 */
	@RequestMapping(value="/synapse/coefficient/save", method=RequestMethod.GET)
	public ModelAndView saveStreamSynapseCoefficeint(HttpServletRequest request,
			@RequestParam(value="synapseId", required=true)Long synapseId,
			StreamSynapseCoefficient streamSynapseCoefficient)
	{
		Map<String, Object> map = new HashMap<String, Object>();
		
		try
		{
			this._streamEventService.saveStreamSynapseCoefficient(synapseId, streamSynapseCoefficient);
			
			map.put("streamSynapseCoefficient", streamSynapseCoefficient);
		}
		catch (Exception error)
		{
			logger.error(error.getMessage(), error);
		}
		
		return new ModelAndView("jsonView", map);
	}
}